<?php
	try {
	    require_once '../../controller/controller.inc.php';
		$usuario->isAuthorizedView(Operacao::MOVIMENTACAO_HISTORICO);
		
		// Inicialização das variáveis, em caso de erro
	    $info      = NULL;
	    $headerUrl = NULL;
		
	    if (!isset($_GET) OR !isset($_GET['id'])) {
	        header('location: ../encaminhamentos/pesquisar.php');
	    }
	    
		$vaga = new Vaga($_GET['id']);
		
	    // Autorização da Vaga
	    if (!$vaga->vagaid) {
	    	throw new Exception('Vaga indisponível. Por favor, escolha outra vaga.');
	    }
	    
	    if (!$usuario->isVagaPermitida($vaga->vagaid)) {
            header('Location:pesquisar.php?message=unauthorized&vagaid='.$vaga->vagaid);  
	    }
	    
	    $lotacao = $vaga->getLotacao();
	    $contrato = $vaga->getContrato();
	    $salario = new Salario(NULL, $contrato->contratoid, $vaga->cargoid);
		$candidatoVaga = $vaga->getCandidatoVagaAtivo();
		$candidato = $candidatoVaga->getCandidato();
		$historico = $candidatoVaga->getHistoricoAtual();
		$statusid = ($historico) ? $historico->statusid : NULL;
		$lista = listar();
		
		if ($contrato->emRescisao()) {
		    $info = "Não será mais possível movimentar este candidato nessa vaga e
		    nesse contrato, pois o mesmo está em fase de rescisão.";
		} elseif (!$contrato->podeMovimentarCandidatos()) {
		    $info = 'Não será possível movimentar este candidato, pois o contrato
		    não está confirmado.';
		}
		
		// Carrega as informacoes de relotacao ou mudança de cargo
		if (hasMovimentacaoAndamento()) {
		    $mov = $candidatoVaga->getMovitacoesCandidatoVagaOrigem();
    	    $vagaDestino = $mov->getVagaDestino();
    	    $contratoDestino = $vagaDestino->getContrato();
    	    $lotacaoDestino = $vagaDestino->getLotacao();
    	    
    	    if (
    	       (
    	           $statusid == Status::Candidato_PromocaoSolicitada OR 
    	           $statusid == Status::Candidato_PromocaoEncaminhada
	           ) AND  
    	       $lotacaoDestino->getTableKeyValue() != 
    	           $lotacao->getTableKeyValue() 
            ) {
    	       if ($info == NULL) {
    	           $info = '<b>Atenção</b>: Esta solicitação, além de alterar o 
    	               cargo, está alterando também a lotação.';
    	       }     
    	    }
    	    
    	}
    	
    	if (!$info AND $statusid == Status::Devolucao_SolicitadaNaoComparecimento 
    	    AND $pfcid == PerfilComportamental::Empresa) {
            $info = 'Este terceirizado não compareceu no posto de trabalho. 
				Efetuar a desvinculação do contrato da prefeitura imediatamente.'; 
	     }
		
		if (isset ($_POST["btnAcao"])){
	        $acao = $_POST["btnAcao"];
	        $parecer = isset($_POST['txtObservacao']) ?
	           $_POST['txtObservacao'] : NULL;
	        
	        switch($acao) {
	            // Fluxo: Relotação ---------------------------------------------------------------
	        	case 'Solicitar Relotação':
	            	$_SESSION['parecerRelotacao'] = $parecer;	            	
	            	$headerUrl = "location: relotar.php?id=" .
	            	  $candidatoVaga->candidatovagaid; 
	            	break;
	            
	            case 'Encaminhar Relotação':
	            	FluxoRelotacao::encaminhar($candidatoVaga, $parecer);            	
	            	break;
	            	            
	            case 'Confirmar Relotação':
	            	FluxoRelotacao::confirmar($candidatoVaga);
	            	break;
            	// Fim Fluxo: Relotação -----------------------------------------------------------
	            	
        	    // Fluxo: Desvinculação a Pedido --------------------------------------------------
	            case 'Solicitar Devolução a Pedido':
	            	if (!isset($_POST['txtDataDemissao'])) {
	            		$headerUrl = 'Location:historico.php?id=' .  $vaga->vagaid . '&method=desvinculacao';
	            	}
	            	else {
	            		FluxoDesvinculacaoPedido::solicitar($candidatoVaga, $_POST['txtDataDemissao']);
	            	}
	            	break;
	            	
	            case 'Encaminhar Devolução a Pedido Sem Substituição':
	            	FluxoDesvinculacaoPedido::encaminharSemSubstituicao($candidatoVaga, $parecer);
	            	break;
	            	
            	case 'Encaminhar Devolução a Pedido Com Substituição':
	                FluxoDesvinculacaoPedido::encaminharComSubstituicao($candidatoVaga, $parecer);
	                break;
	            	
	            case 'Confirmar Pedido de Devolução':
	            	FluxoDesvinculacaoPedido::confirmar($candidatoVaga);
            		break;
        		// Fim Fluxo: Desvinculação a Pedido ----------------------------------------------
	            	
            	// Fluxo: Desvinculação -----------------------------------------------------------
	            case 'Solicitar Desvinculacao':
	                FluxoDesvinculacao::solicitar($candidatoVaga, $parecer);
	                break;
	                
                case 'Aprovar Desvinculacao':
	                FluxoDesvinculacao::aprovar($candidatoVaga, $parecer);
	                break;
	                
                case 'Reprovar Desvinculacao':
	                FluxoDesvinculacao::reprovar($candidatoVaga, $parecer);
	                break;
	                
                case 'Encaminhar Desvinculacao Sem Substituicao':
	                FluxoDesvinculacao::encaminharSemSubstituicao($candidatoVaga, $parecer, $_POST['txtDataEncaminharDevolucao']);
	                break;
	                
                case 'Encaminhar Desvinculacao Com Substituicao':
	                FluxoDesvinculacao::encaminharComSubstituicao($candidatoVaga, $parecer, $_POST['txtDataEncaminharDevolucao']);
	                break;
	                
                case 'Confirmar Desvinculacao':
	                FluxoDesvinculacao::confirmar($candidatoVaga, $_POST['txtDataConfirmarDevolucao']);
	                break;
	                
                case 'Finalizar Desvinculacao':
	                FluxoDesvinculacao::finalizar($candidatoVaga, $parecer);
	                break;
	            // Fim Fluxo: Desvinculacao -------------------------------------------------------
	                
	            // Fluxo: Vinculacao --------------------------------------------------------------
	            case 'Encaminhar Posto Trabalho':
	            	FluxoVinculacao::encaminharPostoTrabalho($candidatoVaga, $parecer);	            	
	            	break;
	            	
            	case 'Finalizar Contratacao':
	            	FluxoVinculacao::finalizar($candidatoVaga, $parecer);	            	
	            	break;
	            	
            	case 'Candidato Nao Compareceu':
	            	FluxoVinculacao::candidatoNaoCompareceu($candidatoVaga, $parecer);		            
		            break;
		            
	            case 'Desvinculacao Por Nao Comparecimento':
	                FluxoVinculacao::desvinculacaoPorNaoComparecimento($candidatoVaga, $parecer);
	                break;
                // Fim Fluxo: Vinculacao ----------------------------------------------------------
		           
		       	// Fluxo: Permuta -----------------------------------------------------------------
	            case 'Finalizar Permuta':
            		$candidatoVagaIdNovo = FluxoSolicitacaoRelotacao::finalizarPermuta($candidatoVaga);
            		$headerUrl = "location: historico.php?id=" . $candidatoVagaIdNovo->vagaid;
                    break;
                // Fim Fluxo: Permuta -------------------------------------------------------------	            	
	            	
            	// Fluxo: Promoção ----------------------------------------------------------------
	            case 'Cancelar Mudança de Cargo':
	                
	                $vaga = $candidatoVaga->getVaga();
                    $parecer = $_POST['txtObservacao'];
                    
                    // validacao
                    if (empty($parecer)) {
                        throw new Exception('Parecer não informado');
                    }
                    
                    FluxoPromocao::cancelar($candidatoVaga, $parecer);
                    
                    header('location: historico.php?id=' .
                        $candidatoVaga->vagaid .
                        '&message=alteracao');
                    break;
                                        
                case 'Solicitar Mudança de Cargo':
                    $_SESSION['parecerMudancaCargo'] = $parecer;
                    $headerUrl = "location: mudancacargo.php?id=" . $candidatoVaga->candidatovagaid;	            	
    			    break;
    			
    			case 'Encaminhar Mudança de Cargo a Tercerizada':    			    
    		        FluxoPromocao::encaminhar($candidatoVaga, $parecer);
    			    break;
    			
    			case 'Confirmar Mudança de Cargo':
    			    FluxoPromocao::confirmar($candidatoVaga);
                    break;
                // Fim Fluxo: Promoção ------------------------------------------------------------
	        }
	        
	        if ($erro == NULL AND $headerUrl !== FALSE) {
	            $message = 'alteracao';
    	        
    	        if ($headerUrl == NULL) {
    	            $headerUrl = 'location: historico.php?id=' . $_GET['id'] . '&message=' . $message;
    	        }
    	        
    	        header($headerUrl);
    	    }
	    }
	} 
    catch(Exception $e) {
		$erro = $e->getMessage();
	}
	
	function getHistoricosEmpresaSQL()
	{
	    $idsHistoricos  = '';
	    $idsHistoricos .= Status::Candidato_Informado . ',';
	    $idsHistoricos .= Status::Candidato_Contratado . ',';
	    $idsHistoricos .= Status::Devolucao_Confirmada . ',';
	    $idsHistoricos .= Status::Devolucao_Pedido_Confirmado . ',';
	    $idsHistoricos .= Status::Devolucao_Encaminhada . ',';
	    $idsHistoricos .= Status::Devolucao_Encaminhada_Substituicao . ',';
	    $idsHistoricos .= Status::Devolucao_SolicitadaNaoComparecimento . ',';
	    $idsHistoricos .= Status::Permutacao_Solicitada . ',';
	    $idsHistoricos .= Status::Candidato_PromocaoEncaminhada . ',';
	    $idsHistoricos .= Status::Relotacao_Encaminhada . ',';
	    $idsHistoricos .= Status::Devolucao_Pedido_Solicitado;
	    
	    return $idsHistoricos;
	}
	
	function listar()
	{
	    global $candidatoVaga, $pfcid;
	    
	    if (!$candidatoVaga->vagaid OR !$candidatoVaga->candidatoid) { 
	        return NULL;
	    }
	    
	    $sql = "SELECT dataregistro, status, observacao, statusid, solicitante 
				FROM vwhistoricocandidato 
				WHERE vagaid = " . $candidatoVaga->vagaid . "
				AND candidatoid = $candidatoVaga->candidatoid ";
        
		if ($pfcid == PerfilComportamental::Empresa) {
		    $sql .= ' AND statusid IN (' . getHistoricosEmpresaSQL() . ')';
		}
		
		$result = TUtils::CriarResultSet($sql);
		
		if (pg_num_rows($result) == 0) {
		    return NULL;
		}
	    
		return pg_fetch_all($result);
	}
	
	function hasMovimentacaoAndamento()
	{
	    global $statusid;
	    
	    return in_array($statusid, array(
		        Status::Relotacao_Solicitada, 
		        Status::Relotacao_Encaminhada, 
		        Status::Candidato_PromocaoSolicitada, 
		        Status::Candidato_PromocaoEncaminhada));
	}
	
	function parecerIsVisible()
	{
		global $candidatoVaga, $pfcid;

		// Empresa nunca vê o campo
		if ($pfcid == PerfilComportamental::Empresa) {
			return FALSE;
		}
		
		if (
		    // Fluxo: Vinculação
		    FluxoVinculacao::isAuthorized('encaminharPostoTrabalho', $candidatoVaga)
		    OR FluxoVinculacao::isAuthorized('finalizar', $candidatoVaga)
		    OR FluxoVinculacao::isAuthorized('candidatoNaoCompareceu', $candidatoVaga)
		    OR FluxoVinculacao::isAuthorized('desvinculacaoPorNaoComparecimento', $candidatoVaga)
		    // Fluxo: Relotação
		    OR FluxoRelotacao::isAuthorized('solicitar', $candidatoVaga)
		    OR FluxoRelotacao::isAuthorized('encaminhar', $candidatoVaga)
		    // Fluxo: Promoção
		    OR FluxoPromocao::isAuthorized('solicitar', $candidatoVaga)
		    OR FluxoPromocao::isAuthorized('cancelar', $candidatoVaga)
		    OR FluxoPromocao::isAuthorized('encaminhar', $candidatoVaga)
		    // Fluxo: Desvinculação
		    OR FluxoDesvinculacao::isAuthorized('solicitar', $candidatoVaga)
		    OR FluxoDesvinculacao::isAuthorized('aprovar', $candidatoVaga)
		    OR FluxoDesvinculacao::isAuthorized('encaminharComSubstituicao', $candidatoVaga)
		    OR FluxoDesvinculacao::isAuthorized('encaminharSemSubstituicao', $candidatoVaga)
		    OR FluxoDesvinculacao::isAuthorized('finalizar', $candidatoVaga)
		    // Fluxo: Desvinculação a Pedido
		    OR FluxoDesvinculacaoPedido::isAuthorized('solicitar', $candidatoVaga)
		    OR FluxoDesvinculacaoPedido::isAuthorized('encaminharComSubstituicao', $candidatoVaga)
		    OR FluxoDesvinculacaoPedido::isAuthorized('encaminharSemSubstituicao', $candidatoVaga)
		    ) {
	        return TRUE;
	    }
				
		return FALSE;	
	}
?>